/**
 * file.js 与文件有关的操作类
 */
const fse = require('fs-extra');
const fs = require("fs");
const path = require('path');

/**
 * 将origin位置的文件写入到target中
 * @param {String} origin 源文件路径
 * @param {String} target 目标文件路径
 */
const writeFile = async function (origin, target) {
  if (!origin || !target) {
    return { status: false, msg: '文件路径不能为空!' };
  }
  if ((typeof origin != 'string') || (typeof target != 'string')) {
    return { status: false, msg: '参数错误 源文件路径和目标文件路径必须是字符串!' };
  }
  if (!fs.existsSync(origin)) {
    return { status: false, msg: '源文件不存在,请检查路径!' };
  }
  if (fs.existsSync(target)) {
    return { status: false, msg: '目标文件已经存在,请不要重复上传文件!' };
  }
  try {
    await fse.move(origin, target);
    return { status: true, msg: '文件上传成功!' };
  } catch (error) {
    return { status: false, msg: '文件位移失败' };
  }
}

/**
 * 上传完file后的文件临时存储地
 */
const fileMap = new Map();

/**
 * 在fileMap中存储value addFile(uuid,{});
 * @param {String} key 
 * @param {object} value 
 * @returns 
 */
const addFileRedis = async function (key, value, app) {
  if (!key || !value)
    return false;
  try {
    value = JSON.stringify(value);
    await app.redis.set(key, value);
  } catch (error) {

  }

  return true;
}

const getFileRedis = async function (key, app) {
  if (!key)
    return null;
  const str = await app.redis.get(key);
  if (!str || typeof str != 'string')
    return null;
  return JSON.parse(str);
}

const removeFileRedis = async function (key, app) {
  if (!key)
    return false;
  const file = await app.redis.get(key);
  await app.redis.del(key);
  return file;
}

const removeFile = function (filePath) {
  if (!filePath) {
    return false
  }
  const temp = path.join(__filename, '../../', filePath);
  try {
    fs.unlinkSync(temp);
    return true;
  } catch (error) {
    return false;
  }
}


/**
 * 在上传文件目录创建对应的
 * @param {string} directoryName 目录名称
 * @param {string} parentDirectory 父级文件目录路径
 * @returns -1 创建失败
 */
const createDirectory = function(directoryPath){
  if(!directoryPath || typeof  directoryPath !='string'){
    return false;
  }
  if(fs.existsSync(directoryPath)){
    return false;
  }
  fs.mkdirSync(directoryPath);
  return true;
}


module.exports = {
  writeFile,
  addFileRedis,
  getFileRedis,
  removeFileRedis,
  removeFile,
  createDirectory
}